import type {EventCallbackFunction, EventData, EventType} from "@/event/index";
import EventListener from "@/event/EventListener.ts";
import EventPublisher from "@/event/EventPublisher.ts";

/**
 * 全局事件总线类, 全称为EventBus, 此类处理全局事件的监听和时间发布
 */
export default class EventBus{

    /**
     * 全局事件监听注册处理方法
     * @param {string} eventType - 事件监听类型
     * @param {function} callback - 事件监听的回调方法
     * @param {string} identity - 监听者的身份标识, 用于取消对事件的监听
     * @remarks
     * - 监听器将仅响应与与“eventType”完全匹配的事件
     * - 必须调用 'ack' 函数以防止内存泄漏
     * - 同一个身份不可以重复监听同一个事件类型的事件
     * returns {void}
     */
    public static listener<T extends EventType>(eventType: T, callback: EventCallbackFunction<T>, identity: string){
        EventListener.listener(eventType,callback,identity);
    }

    public static unListener(eventType: EventType, identity: string){
        EventListener.unListener(eventType,identity);
    }

    /**
     * 全局事件发布方法
     * @param eventType 发布的事件类型
     * @param data 发布的事件数据
     * @param publisher 发布者标识
     * @param ack 事件处理成功的确认方法
     */
    public static publish<T extends EventType>(eventType: T, data: EventData<T>, publisher: string, ack: (success: boolean) => void){
        EventPublisher.publish(eventType, data, publisher, ack);
    }


}

